package jvm;

/**
 *栈上分配，标量替换
 * 代码调用了1亿次alloc()，如果分配到堆上，大概需要1GB以上的堆空间，如果堆空间小于该值，必然触发GC
 *
 *
 * 使用如下参数不会发生GC
 * -Xmx15m -Xms15m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:+EliminateAllocations
 *
 * 使用如下参数都会发生大量GC
 * -Xms15m -Xmx15m -XX:PrintGC -XX:-DoEscapeAnalysis -XX:+EliminateAllocations
 * -Xms15m -Xmx15m -XX:PrintGC -XX:+DoEscapeAnalysis -XX:-EliminateAllocations
 *  逃逸分析和标量替换必须同时开启
 */

public class AllotOnStack {

    public static void main(String[] args) {
        for (int i=0;i<100000000;i++){
            alloc();
        }
    }

    public static void alloc(){
        User user = new User();
        user.setId(1);
        user.setName("zhigan");
    }

}

class User{
    int id;
    String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
